<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>

<body>
  <script>
    const origin = {
      name: "mumu",
      friend: ["小红", "小南", { name: "小张" }],
      say: function () { alert('开心图图') }
    }
    // 浅拷贝（只拷贝第一层值类型）
    /* 01 解构
    var obj1 = {...origin};
    // 02 Object.assigin
    var obj2 = Object.assign({},origin)
    // 03 遍历
    var obj3 = {};
    for(var k in origin){
      obj3[k] = origin[k]
    }
    // 深拷贝（引用类型相互不引用）
    // 01 转字符串(会丢失函数)
    // json格式，数组，对象，字符串，null，数字，undefined
    var obj4 = JSON.parse(JSON.stringify(origin))*/
    // 02 递归
    // 什么时递归：函数调用函数自己，必须要有结束条件
    function deepCopy(obj) {
      if (typeof obj === "object" && obj !== null) {
        // 引用类型
        var temp;
        // 如果是数组
        if (obj instanceof Array) {
          temp = [];
          for (var i = 0; i < obj.length; i++) {
            // 实现递归
            temp[i] = deepCopy(obj[i])
          }
        } else {
          // 如果是对象
          temp = {};
          for (var k in obj) {
            // 实现递归
            temp[k] = deepCopy(obj[k]);
          }
        }
        return temp;
      } else {
        // 值类型
        return obj;
      }
    }
    var obj5 = deepCopy(origin);


    // 5+4+3+2+1 n+到1
    // function add(n){
    //   if(n==1){return 1}
    //   return n+add(n-1)
    // }
    // alert(add(5))   
    // 7*5*3*1 的结果
    // [1,1,2,3,5,8,13,21,34]
    // function fib(n){
    //   if(n==1||n==2){return 1}
    //   return fib(n-1)+fib(n-2);
    // }
    // alert(fib(43))

    // function fib(n){
    //   var arr = [1,1];
    //   if(n==1||n==2){return 1};
    //   for(var i=3;i<=n;i++){
    //     var el = arr[i-2]+arr[i-3];
    //     arr.push(el);
    //   }
    //   return arr.pop();
    // }
    // alert(fib(1800))

    // fib(2)+fib(1)
    // 1+1
    var arr = [1, [2, 3, [4, 5, [6]]], 7, [8, 9]];
    // [1,2,3,4,5,6,7,8,9]
    function flat(arr) {
      // 返回的数据
      var temp = [];
      // 遍历数据
      for (var i = 0; i < arr.length; i++) {
        // 如果遍历的元素是数组，就递归遍历
        if (arr[i] instanceof Array) {
          // 如果一个数组，接着遍历
          temp.push(...flat(arr[i]))
        } else {
          // 不是就直接添加
          temp.push(arr[i])
        }
      }
      // 返回数组
      return temp;
    }
    console.log(flat(arr));

  </script>
</body>

</html>